﻿using Kanban.Entity;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;

namespace Kanban.Repository
{
    public class EquipeRepository : RepositoryBase
    {
        public List<Equipe> Listar()
        {
            string sql = "SELECT Id, Nome, IdUsuario FROM [PREFIXO_TABELA]Equipe WHERE Excluido = 0";

            return this.Listar<Equipe>(sql, null, this.PopularObjeto);
        }

        public List<Equipe> ListarPorUsuario(string nome)
        {
            string sql = @" DECLARE @IsMaster BIT
                            DECLARE @IdUsuario INT

                            SET @IsMaster = 0
                            SELECT @IdUsuario = Id FROM [PREFIXO_TABELA]Usuario WHERE Nome = @Nome

                            IF EXISTS(SELECT * FROM [PREFIXO_TABELA]Usuario WHERE Id = @IdUsuario AND Permissoes LIKE '%Master%') BEGIN
	                            SET @IsMaster = 1
                            END

                            SELECT e.Id, e.Nome, e.IdUsuario FROM [PREFIXO_TABELA]Equipe e 
                            WHERE e.Excluido = 0 AND (e.IdUsuario = @IdUsuario OR @IsMaster = 1) ORDER BY e.Nome";

            var parametros = new Dictionary<string, object>();
            parametros.Add("Nome", nome);          

            return this.Listar<Equipe>(sql, parametros, this.PopularObjeto);
        }     

        public Equipe ObterPorId(int id)
        {
            string sql = "SELECT Id, Nome, IdUsuario FROM [PREFIXO_TABELA]Equipe WHERE Id = @Id";

            var parametros = new Dictionary<string, object>();
            parametros.Add("Id", id);            

            return this.Obter<Equipe>(sql, parametros, this.PopularObjeto);
        }

        public void Atualizar(Equipe equipe)
        {
            var parametros = new Dictionary<string, object>();
            parametros.Add("Nome", equipe.Nome);            

            this.Atualizar<Equipe>(equipe.Id, parametros);
        }

        public void Adicionar(Equipe equipe)
        {
            var parametros = new Dictionary<string, object>();
            parametros.Add("Nome", equipe.Nome);
            parametros.Add("IdUsuario", equipe.CriadaPor.Id);

            int id = Convert.ToInt32(this.Adicionar<Equipe>(parametros));
            equipe.Id = id;
        }

        private Equipe PopularObjeto(IDataReader leitorSql)
        {
            var equipe = new Equipe();
            equipe.Id = leitorSql.GetInt32(0);
            equipe.Nome = leitorSql.GetString(1);
            equipe.CriadaPor = new Usuario();
            equipe.CriadaPor.Id = leitorSql.IsDBNull(2) ? 0 : leitorSql.GetInt32(2);
            return equipe;
        }

        public void AdicionarUsuario(int idEquipe, Usuario usuario)
        {
            var parametros = new Dictionary<string, object>();
            parametros.Add("IdEquipe", idEquipe);
            parametros.Add("Nome", usuario.Nome);

            string sql = @" DECLARE @IdUsuario INT

                            SELECT @IdUsuario = Id FROM [PREFIXO_TABELA]Usuario WHERE Nome = @Nome

                            IF @IdUsuario IS NULL BEGIN
                                
                                INSERT INTO [PREFIXO_TABELA]Usuario(Nome) VALUES(@Nome)

                                SET @IdUsuario = @@IDENTITY  

                            END

                            INSERT INTO [PREFIXO_TABELA]EquipeUsuario(IdEquipe, IdUsuario) VALUES(@IdEquipe, @IdUsuario)

                            SELECT @IdUsuario
                          ";

            int id = Convert.ToInt32(this.Adicionar(sql, parametros));

            usuario.Id = id;
        }

        public void ExcluirUsuarioPorEquipe(int idEquipe, int idUsuario)
        {
            var parametros = new Dictionary<string, object>();
            parametros.Add("IdEquipe", idEquipe);
            parametros.Add("IdUsuario", idUsuario);

            string sql = @"DELETE FROM [PREFIXO_TABELA]EquipeUsuario
                           WHERE IdEquipe = @IdEquipe AND IdUsuario = @IdUsuario";

            this.Executar(sql, parametros);
        }

        public List<Equipe> ObterPorUsuario(int idUsuario)
        {
            string sql = "SELECT e.Id, e.Nome, e.IdUsuario FROM [PREFIXO_TABELA]Equipe e INNER JOIN [PREFIXO_TABELA]EquipeUsuario u ON u.IdEquipe = e.Id WHERE u.IdUsuario = @IdUsuario AND e.Excluido = 0 ORDER BY e.Nome";

            var parametros = new Dictionary<string, object>();
            parametros.Add("IdUsuario", idUsuario);

            return this.Listar<Equipe>(sql, parametros, this.PopularObjeto);
        }

        public void Excluir(int id)
        {
            var parametros = new Dictionary<string, object>();
            parametros.Add("Excluido", true);

            this.Atualizar<Equipe>(id, parametros);
        }
    }
}
